package com.xiangge;
/*
      6.运算符（operator）:
         分类：
             算术运算符
             复制运算符
             比较运算符
             逻辑运算符
             三目运算符
             位运算符

         --  算术运算符 ：
            明确: 一元 - 只需要一个操作数就能完成运算的运算符
                  二元 - 需要两个操作数才能完成运算的运算符
             1. 二元算术运算符：
                  分类： + , - , * , / , %
                  + :
                     情况一： 正号     例如： +9
                     情况二： 加号     两边的操作数可以是： 数值类型 或者 字符类型 的常量值,变量 或者表达式    常用     参考小学二年级
                          例如： 10 + 3.14
                          例如： 10 + 'a'
                     情况三: 字符串连接符 两边的操作时至少有一个是字符串常量值,变量或者字符串表达式    常用
                          例如： "tom" + 666
                          例如： 100 + "年软帝"
                          例如： "hello" + "world"
                          原则： 从左往右一顺拼接,有小括号先算小括号

                   - ：
                     情况一： 负号    例如： -7
                     情况二： 减号    例如： 10 - 3      参考小学二年级

                   * :
                     情况一： 乘号   例如： 10 * 4

                   / ：
                     情况一： 除号    例如：5 / 2
                     说明： 整数和整数做除法只能得到整数,小数部分会舍弃
                           java中被除数/分母不能为0，否则： java.lang.ArithmeticException  数学异常
                    % :
                     情况一： 取余
                     说明: 取余得到余数 , 表达式的最后结果的类型一定是参与运算的最高类型

             2. 一元算术运算符：++ , --
                 以++为例：
                    描述： 将"变量"的值自增加1赋值给自己
                    注意： ++和--只能作用于变量
                    使用场景：
                       单独使用：++在变量前还是变量后,效果一样 , 都是让变量的值自增加1      95%
                       使用场景:循环语句中
                       参与其他运算：    5%
                          ++ 在变量后： 先让变量自增之前的值参与其他运算,运算完成后再自增
                          ++ 在变量前： 先让变量自增加1 , 再让自增之后的值参与其他运算
             【思考】
                1、可以对常量进行递增或递减操作吗？例如：5++或++5。
                     不能,常量值不能变

                2、int num = 5; num = num++;请问代码执行后num的值为多少？  5

             【随堂练习】
                1.int a = 3, b = 4; 求a++ / 3 + --b * 2 - a-- % 6 + b++ * 3 - ++b的值。
                    提示： 在运算符过程中,a和b不断会变化
                  格式转换：(a++ / 3) + (--b * 2) - (a-- % 6) + (b++ * 3) - (++b)
                     以a = 3, b = 4 计算： (a++ / 3) ---> 3 / 3 = 1 ,    a = 4 ;
                     以a = 4, b = 4 计算： (--b * 2) --->  b = 3 , (3 * 2) = 6 ;
                     以a = 4, b = 3 计算： (a-- % 6) ---> (4 % 6) = 4 , a = 3  ;
                     以a = 3, b = 3 计算： (b++ * 3) ---> (3 * 3) = 9 , b = 4  ;
                     以a = 3, b = 4 计算： (++b) ---> b = 5 , (5) --> 5
                     最后： 1 + 6 - 4 + 9 - 5 = 7   a = 3 , b = 5

               结论:
                  1. m > 0 , n > 0 时 , m % n = [0,n-1]
                  2. n > 0 , n % 2 = [0,1] ,
                      n 是偶数： n % 2 == 0    常用
                      n 是偶数： n % 2 != 1
                      n 是奇数： n % 2 == 1    常用
                      n 是奇数： n % 2 != 0
 */
public class OperatorDemo1 {
    public static void main(String[] args) {
        System.out.println(0 % 4); // 0
        System.out.println(1 % 4); // 1
        System.out.println(2 % 4); // 2
        System.out.println(3 % 4); // 3
        System.out.println(4 % 4); // 0
        System.out.println(5 % 4); // 1
        System.out.println(6 % 4); // 2
    }
    public static void main6(String[] args) {
        int a = 3, b = 4;
        int result = a++ / 3 + --b * 2 - a-- % 6 + b++ * 3 - ++b;
        System.out.println("result = " + result);
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
    public static void main5(String[] args) {
        int num = 5;
        num = num++;
        System.out.println("num = " + num); // num = 5
    }
    public static void main4(String[] args) {
        int age = 10;

        // 将年龄age增加1
        // age = age + 1;
        // age ++;
        // ++ age;
        System.out.println("age = " + age); // age = 11

        //  int result = age ++ + 1;    //   (age ++) --- 10
        /*
           ++ 在变量后面：
             1. 先让变量自增之前的值参与其他运算： int result = age  + 1;
             2. 其他的运算完成之后，再然变量自增： age++;
         */


        int result = ++ age + 1;    //   (++ age) --- 11

         /*
           ++ 在变量前面：
             1. 先让变量自增加1 ：  age++;
             2. 然后再让自增之后的age的值：11 , 参与其他运算 ：   int result = 11 + 1;

         */
        System.out.println("result = " + result); // result = 12


    }
    public static void main3(String[] args) {
        System.out.println(10 / 3); // 3
        System.out.println(5 / 2); // 2

        System.out.println(10 % 3); // 1
        System.out.println(10 % 3.0); // 1.0

        int num = 10 / 0;
        System.out.println("num = " + num);
    }
    public static void main2(String[] args) {
        System.out.println("软帝" + 666);
        System.out.println(99 + 1 + "年软帝");
        System.out.println("软帝" + 99 + 1 + "年");
        System.out.println("软帝" + (99 + 1) + "年");
    }
    public static void main1(String[] args) {
        System.out.println(+9); // 9
        System.out.println(10 + 3.14);
        System.out.println(10 + 'a');
        int age = 19;
        System.out.println(age / 2 + 3);

    }
}
